package code18_design.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class Test02 {

	public static void main(String[] args) {
		UserServiceImpl userServiceImpl = new UserServiceImpl();
		
		// 获取代理类的对象, 需要三个参数:
		// 1.目标类的类加载器
		ClassLoader classLoader = UserServiceImpl.class.getClassLoader();
		// 2.目标类实现的接口(要被代理的功能)
		Class<?>[] interfaces = UserServiceImpl.class.getInterfaces();
		// 3.代理类需要做的事情
		// 传入目标类的对象
		InvocationHandler handler = new MyHandler(userServiceImpl);
		
		// 使用 被代理的功能对应的 接口接收 对象
		UserService proxy = (UserService) Proxy.newProxyInstance(
				classLoader, 
				interfaces, 
				handler);
		proxy.login("tom", "123");
		System.out.println("------------------");
		System.out.println("toString:"+proxy.toString());
	}
	
}
class MyHandler implements InvocationHandler {
	private Object target;
	public MyHandler(Object target) {
		this.target = target;
	}
	/**
	 * proxy: 当前代理的对象
	 * method: 代理的方法(功能)
	 * args: 被代理的方法的参数
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		// 代理类需要做的事情
		System.out.println("执行的方法是:" + method + ", 参数是:" + Arrays.toString(args));
		
		// (核心)目标类的方法的执行
		// target.method(args);
		Object result = method.invoke(target, args);
		
		return result;
	}
	
}
